from datetime import date, datetime  # noqa: F401

from typing import List, Dict  # noqa: F401

from plugin.models.base_model import Model
from plugin.models.package import Package
from plugin.models.vulnerability_cvss import VulnerabilityCvss
from plugin.models.vulnerability_distro import VulnerabilityDistro
from plugin.models.vulnerability_fix import VulnerabilityFix
from plugin.models.vulnerability_severity import VulnerabilitySeverity
from plugin import util

from plugin.models.package import Package  # noqa: E501
from plugin.models.vulnerability_cvss import VulnerabilityCvss  # noqa: E501
from plugin.models.vulnerability_distro import VulnerabilityDistro  # noqa: E501
from plugin.models.vulnerability_fix import VulnerabilityFix  # noqa: E501
from plugin.models.vulnerability_severity import VulnerabilitySeverity  # noqa: E501

class Vulnerability(Model):
    """NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).

    Do not edit the class manually.
    """

    def __init__(self, vulnerability_name=None, description=None, severity=None, links=None, distro=None, cvss=None, package=None, fix=None, layer_id=None, path=None):  # noqa: E501
        """Vulnerability - a model defined in OpenAPI

        :param vulnerability_name: The vulnerability_name of this Vulnerability.  # noqa: E501
        :type vulnerability_name: str
        :param description: The description of this Vulnerability.  # noqa: E501
        :type description: str
        :param severity: The severity of this Vulnerability.  # noqa: E501
        :type severity: VulnerabilitySeverity
        :param links: The links of this Vulnerability.  # noqa: E501
        :type links: List[str]
        :param distro: The distro of this Vulnerability.  # noqa: E501
        :type distro: VulnerabilityDistro
        :param cvss: The cvss of this Vulnerability.  # noqa: E501
        :type cvss: List[VulnerabilityCvss]
        :param package: The package of this Vulnerability.  # noqa: E501
        :type package: Package
        :param fix: The fix of this Vulnerability.  # noqa: E501
        :type fix: VulnerabilityFix
        :param layer_id: The layer_id of this Vulnerability.  # noqa: E501
        :type layer_id: str
        :param path: The path of this Vulnerability.  # noqa: E501
        :type path: str
        """
        self.openapi_types = {
            'vulnerability_name': str,
            'description': str,
            'severity': VulnerabilitySeverity,
            'links': List[str],
            'distro': VulnerabilityDistro,
            'cvss': List[VulnerabilityCvss],
            'package': Package,
            'fix': VulnerabilityFix,
            'layer_id': str,
            'path': str
        }

        self.attribute_map = {
            'vulnerability_name': 'vulnerabilityName',
            'description': 'description',
            'severity': 'severity',
            'links': 'links',
            'distro': 'distro',
            'cvss': 'cvss',
            'package': 'package',
            'fix': 'fix',
            'layer_id': 'layerId',
            'path': 'path'
        }

        self._vulnerability_name = vulnerability_name
        self._description = description
        self._severity = severity
        self._links = links
        self._distro = distro
        self._cvss = cvss
        self._package = package
        self._fix = fix
        self._layer_id = layer_id
        self._path = path

    @classmethod
    def from_dict(cls, dikt) -> 'Vulnerability':
        """Returns the dict as a model

        :param dikt: A dict.
        :type: dict
        :return: The Vulnerability of this Vulnerability.  # noqa: E501
        :rtype: Vulnerability
        """
        return util.deserialize_model(dikt, cls)

    @property
    def vulnerability_name(self) -> str:
        """Gets the vulnerability_name of this Vulnerability.


        :return: The vulnerability_name of this Vulnerability.
        :rtype: str
        """
        return self._vulnerability_name

    @vulnerability_name.setter
    def vulnerability_name(self, vulnerability_name: str):
        """Sets the vulnerability_name of this Vulnerability.


        :param vulnerability_name: The vulnerability_name of this Vulnerability.
        :type vulnerability_name: str
        """

        self._vulnerability_name = vulnerability_name

    @property
    def description(self) -> str:
        """Gets the description of this Vulnerability.


        :return: The description of this Vulnerability.
        :rtype: str
        """
        return self._description

    @description.setter
    def description(self, description: str):
        """Sets the description of this Vulnerability.


        :param description: The description of this Vulnerability.
        :type description: str
        """

        self._description = description

    @property
    def severity(self) -> VulnerabilitySeverity:
        """Gets the severity of this Vulnerability.


        :return: The severity of this Vulnerability.
        :rtype: VulnerabilitySeverity
        """
        return self._severity

    @severity.setter
    def severity(self, severity: VulnerabilitySeverity):
        """Sets the severity of this Vulnerability.


        :param severity: The severity of this Vulnerability.
        :type severity: VulnerabilitySeverity
        """

        self._severity = severity

    @property
    def links(self) -> List[str]:
        """Gets the links of this Vulnerability.


        :return: The links of this Vulnerability.
        :rtype: List[str]
        """
        return self._links

    @links.setter
    def links(self, links: List[str]):
        """Sets the links of this Vulnerability.


        :param links: The links of this Vulnerability.
        :type links: List[str]
        """

        self._links = links

    @property
    def distro(self) -> VulnerabilityDistro:
        """Gets the distro of this Vulnerability.


        :return: The distro of this Vulnerability.
        :rtype: VulnerabilityDistro
        """
        return self._distro

    @distro.setter
    def distro(self, distro: VulnerabilityDistro):
        """Sets the distro of this Vulnerability.


        :param distro: The distro of this Vulnerability.
        :type distro: VulnerabilityDistro
        """

        self._distro = distro

    @property
    def cvss(self) -> List[VulnerabilityCvss]:
        """Gets the cvss of this Vulnerability.


        :return: The cvss of this Vulnerability.
        :rtype: List[VulnerabilityCvss]
        """
        return self._cvss

    @cvss.setter
    def cvss(self, cvss: List[VulnerabilityCvss]):
        """Sets the cvss of this Vulnerability.


        :param cvss: The cvss of this Vulnerability.
        :type cvss: List[VulnerabilityCvss]
        """

        self._cvss = cvss

    @property
    def package(self) -> Package:
        """Gets the package of this Vulnerability.


        :return: The package of this Vulnerability.
        :rtype: Package
        """
        return self._package

    @package.setter
    def package(self, package: Package):
        """Sets the package of this Vulnerability.


        :param package: The package of this Vulnerability.
        :type package: Package
        """

        self._package = package

    @property
    def fix(self) -> VulnerabilityFix:
        """Gets the fix of this Vulnerability.


        :return: The fix of this Vulnerability.
        :rtype: VulnerabilityFix
        """
        return self._fix

    @fix.setter
    def fix(self, fix: VulnerabilityFix):
        """Sets the fix of this Vulnerability.


        :param fix: The fix of this Vulnerability.
        :type fix: VulnerabilityFix
        """

        self._fix = fix

    @property
    def layer_id(self) -> str:
        """Gets the layer_id of this Vulnerability.


        :return: The layer_id of this Vulnerability.
        :rtype: str
        """
        return self._layer_id

    @layer_id.setter
    def layer_id(self, layer_id: str):
        """Sets the layer_id of this Vulnerability.


        :param layer_id: The layer_id of this Vulnerability.
        :type layer_id: str
        """

        self._layer_id = layer_id

    @property
    def path(self) -> str:
        """Gets the path of this Vulnerability.


        :return: The path of this Vulnerability.
        :rtype: str
        """
        return self._path

    @path.setter
    def path(self, path: str):
        """Sets the path of this Vulnerability.


        :param path: The path of this Vulnerability.
        :type path: str
        """

        self._path = path
